package 蚂蚁课堂;

import java.util.Arrays;
import java.util.List;
import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;

/**
 * 当高并发来了，Semaphore会控制并发的数量。
 *  * Semaphore有2个构造方法：
 *  *      new Semaphore(int permits) 创建一个 Semaphore与给定数量的许可证和非公平设置。 就是第一个线程来了，并不能保证第一个线程能抢到商品
 *  *      Semaphore(int permits, boolean fair):创建一个 Semaphore与给定数量的许可证和给定的公平设置。fair=true 则该信号量是公平的
 * 比如秒杀spuId=100的商品，该商品库存是66，那么我们就是new Semaphore(66);
         假设每次仅能秒杀一个，则调用semaphore.acquire()；来获取一个许可证，若能获取到许可证则向下执行，获取不到则进入等待状态
         最后我们代码走完了要将许可证归还给Semaphore信号量,所以要调用semaphore.release();
 *
 */
public class SemaphoreDemo {

    public static void main(String[] args) {
        /**
         * 创建信号量对象【车库】，给3个许可证【车位】
         */
        final Semaphore semaphore=new Semaphore(3);
        for (int i=0;i<6;i++){
            new Thread(new Runnable() {
                public void run() {
                    try {
                        /**
                         * 从该信号量获取1个许可证，获取不到许可证则等待
                         */
                        semaphore.acquire();
                        System.out.println(Thread.currentThread().getName()+"获取到了车位");
                        TimeUnit.SECONDS.sleep(3);
                        System.out.println(Thread.currentThread().getName()+"离开了");
                    } catch (Exception e) {
                        e.printStackTrace();
                    }finally {
                        /**
                         * 释放许可证【释放车位】，将其返回到信号量中
                         */
                        semaphore.release();
                    }
                }
            },i+"").start();
        }
    }
}
